<?php
/* 
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
*/
include_once("Home_Recuperacion/Logica/donacion.php");
include_once("Home_Recuperacion/Logica/voluntario.php");
include_once("Home_Recuperacion/Logica/MainImport.php");//Import de recuperacion
include_once("FachadaBD.php");
include_once("Preparacion/Logica/Usuario.php");
include_once("Preparacion/Logica/Foro.php");
include_once("Preparacion/Logica/ListaForos.php");
include_once("Preparacion/Logica/ListaMensajes.php");
include_once("Preparacion/Logica/ListaGrupos.php");
include_once("Preparacion/Logica/Mensaje.php");
include_once("Preparacion/Logica/Grupo.php");
include_once("Preparacion/Logica/Privilegio.php");
include_once("Preparacion/Logica/ListaTablas.php");
include_once("Preparacion/Logica/ListaPrivilegios.php");
include_once("Respuesta/PersonaAfectada.php");
include_once("Respuesta/Lista.php");
include_once("Respuesta/CentroApoyo.php");
include_once("Respuesta/ZonaEmergencia.php");



class FachadaI {

    // Para implementar el patron singleton.
    private static $instance;

    // Metodo que permite obtener la unica instancia de la clase.
    public static function getInstance() {

        //si no existe instancia de la clase se crea
        // si existe se retorna la instancia existente.
        if( self::$instance == null ) {
            self::$instance = new self();
        }

        return self::$instance;
    }

    // Privado se previene la creacion via new.
    private function __construct() {

    }

    // Para evitar la clonacion de este objeto.
    private function __clone() {
        throw new Exception('No se puede clonar');
    }

    public function __wakeup() {
        throw new Exception("No se puede deserializar una instancia de ". get_class($this) ." class.");
    }


    public function __sleep() {
        throw new Exception("No se puede serializar una instancia de ". get_class($this) ." class.");
    }


    //Funciones Mitigacion////////////////////////////////////////////////////


    //Funciones Preparacion///////////////////////////////////////////////////

	function pre_esAdmin($nomb) {
        $nuevo = new Usuario();
		$nuevo->setUsername($nomb);
        $result = $nuevo->esAdmin();
		return $result;
    }
	
    function pre_registrarUsuario($nomb, $apell, $email, $userN, $clave, $info, $vol, $atrib, $tel) {
        $nuevo = new Usuario();
        $nuevo->setNombre($nomb);
        $nuevo->setApellido($apell);
        $nuevo->setEmail($email);
        $nuevo->setUsername($userN);
        $nuevo->setPassword($clave);
        $nuevo->setInformacion($info);
        $nuevo->setVoluntario($vol);
        $nuevo->setAtributos($atrib);
		$nuevo->setTelefono($tel);
        $nuevo->insertarUsuario();
    }

    function pre_modificarUsuario($nomb, $apell, $email, $userN, $clave, $info, $vol, $atrib, $tel) {
        $nuevo = new Usuario();
        $nuevo->setNombre($nomb);
        $nuevo->setApellido($apell);
        $nuevo->setEmail($email);
        $nuevo->setUsername($userN);
        $nuevo->setPassword($clave);
        $nuevo->setInformacion($info);
        $nuevo->setVoluntario($vol);
        $nuevo->setAtributos($atrib);
		$nuevo->setTelefono($tel);
        $nuevo->modificarUsuario();
    }

    function pre_consultarUsuario($nomb) {
        $nuevo = new Usuario();
        $nuevo->getUsuario($nomb);
        $array = $nuevo->getUserArray();
        return $array;
    }

    function pre_editarUsuario($nomb, $apell, $email, $userN, $info, $vol, $atrib) {
        $nuevo = new Usuario();
        $nuevo->setNombre($nomb);
        $nuevo->setApellido($apell);
        $nuevo->setEmail($email);
        $nuevo->setUsername($userN);
        $nuevo->setInformacion($info);
        $nuevo->setVoluntario($vol);
        $nuevo->setAtributos($atrib);
        $nuevo->editarUsuario();
    }
	
	//AGREGUE ESTO NO SE SI ESTA BIEN REVISAR
	
	function mostrar_usuarios(){
		$nuevo = new Usuario();
		$ar = $nuevo->Mostrar_Usuarios();
		$tam = count($ar);
		$i = 1;
		while($i<=$tam){
			$elem = $ar[$i];
			echo "<tr class='mainrow'><td><A href=editarCuentaAdmin.php?id=".$elem["username"].">".$elem["username"]."</a></td><td>".$elem["apellido"]."</td><td>".$elem["nombre"]."</td><td>".$elem["email"]."</td><td>".$elem["telefono"]."</td></tr>";
			$i++;
		}
	}
	
	function mostrar_grupos_pert($UserName){
		$nuevo = new Usuario();
		$ar = $nuevo->Mostrar_Grupos_Pert($UserName);
		$tam = count($ar);
		$i = 1;
		while($i<=$tam){
			$elem = $ar[$i];
			echo "<tr class='mainrow'><td>".$elem["nombre"]."</a></td><td><a href='eliminarUsuarioGrupo.php?grupo=".$elem["nombre"]."&usuario=".$UserName."'>Eliminar</a></td>";
			$i++;
		}
	}
	
	function preInsUserGroup($UserName,$Group){
		
		$nuevo = new Usuario();
		$nuevo->InsertUserGroup($UserName,$Group);
		
	}

	function preEliUserGroup($UserName,$Group){
		
		$nuevo = new Usuario();
		$nuevo->RemovUserGroup($UserName,$Group);
	}
	
	function mostrar_usuarios_keyword($keyword){
		$nuevo = new Usuario();
		$ar = $nuevo->Mostrar_Usuarios_keyword($keyword);
		$tam = count($ar);
		$i = 1;
		while($i<=$tam){
			$elem = $ar[$i];
			echo "<tr class='mainrow'><td><A href=editarCuentaAdmin.php?id=".$elem["username"].">".$elem["username"]."</a></td><td>".$elem["apellido"]."</td><td>".$elem["nombre"]."</td><td>".$elem["email"]."</td><td>".$elem["telefono"]."</td></tr>";
			$i++;
		}
	}

    function pre_eliminar_usuario_actual() {
        $nuevo = new Usuario();
        $nuevo->setUsername($_SESSION['k_username']);
        $nuevo->eliminarUsuario();
        session_destroy();
    }
	
	function pre_eliminar_usuario($name) {
        $nuevo = new Usuario();
        $nuevo->setUsername($name);
        $nuevo->eliminarUsuario();
        session_destroy();
    }

    function pre_validar_usuario($userN, $clave) {
        $nuevo = new Usuario();
        $nuevo->setUsername($userN);
        $nuevo->setPassword($clave);
        return $nuevo->validarUsuario();
    }

    function pre_validar_registro($nombre, $apellido, $username, $password, $password2, $email, $atributos, $informacion, $voluntario) {
        if($username==NULL|$password==NULL|$password2==NULL|$email==NULL|$nombre==NULL|$apellido==NULL) {
            return 0;
        }else {
            if($password!=$password2) {
                return 1;
            }else {

                $nuevo = new Usuario();
                $nuevo->setEmail($email);
                $nuevo->setUsername($username);
                $guarda=$nuevo->usernameEmailCheck();

                if ($guarda==0) {
                    return 2;
                }elseif($guarda==1) {
                    return 3;
                }else {
					return 4;
				}
            }
        }
    }

    function pre_validar_edicion($nombre, $apellido, $username, $password, $password2, $email, $atributos, $informacion, $voluntario) {
        if($username==NULL|$email==NULL|$nombre==NULL|$apellido==NULL) {
            return 0;
        }else {
            if($password!=$password2) {
                return 1;
            }else {

                $nuevo = new Usuario();
                $nuevo->setEmail($email);
                $nuevo->setUsername($username);
                $guarda=$nuevo->usernameEmailCheck();

                if ($guarda==0) {
                    return 2;
                }else {
                    return 3;
                }
            }
        }
    }

    function pre_obternerInformacion() {
        if(isset($_POST["informacion"])) {
            return "si";
        } else {
            return "no";
        }
    }

    function pre_obtenerVoluntariado() {
        if(isset($_POST["voluntario"])) {
            return "si";
        } else {
            return "no";
        }
    }

	function pre_eliminarForo($nombre) {
        $nuevo = new Foro($nombre);
        $nuevo->eliminarForo();
    }
	
    function pre_crearForo($nombre) {
        $nuevo = new Foro($nombre);
        $nuevo->insertarForo();
    }

    function pre_obtenerListaForos() {
        $nuevo = new ListaForos();
        return $nuevo->obtenerListaForos();
    }

    function pre_obtenerListaMensajes($foro) {
        $nuevo = new ListaMensajes();
        return $nuevo->obtenerListaMensajes($foro);
    }

    function pre_obtenerMensaje($id) {
        $nuevo = new Mensaje(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
        $array = $nuevo->obtenerDatosMensaje($id);
        return $array;
    }

    function pre_obtenerHijos($id) {
        $nuevo = new Mensaje(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
        return $nuevo->obtenerHijos($id);
    }

    function pre_agregarMensajePost($name,$yourpost,$subject,$foro) {
        $nuevo = new Mensaje(NULL,$name,$subject,$foro,$yourpost,NULL,NULL,NULL,NULL,NULL,NULL);
        $nuevo->insertarMensajePost();
    }

    function pre_agregarMensajeReply($name,$yourpost,$subject,$id) {
        $nuevo = new Mensaje(NULL,$name,$subject,NULL,$yourpost,NULL,NULL,NULL,NULL,NULL,NULL);
        $nuevo->insertarMensajeReply($id);
    }

    // Funciones relacionadas con grupos
    function pre_crearGrupo($nombre,$descripcion) {
        $nuevo = new Grupo($nombre,$descripcion);
        $nuevo->insertarGrupo();
    }

    function pre_obtenerListaGrupos() {
        $nuevo = new ListaGrupos();
        return $nuevo->obtenerListaGrupos();
    }
	
	function pre_obtenerGrupos() {
        $nuevo = new ListaGrupos();
        return $nuevo->obtenerGrupos();
    }

    function pre_consultarGrupo($nomb,$desc) {
        $nuevo = new Grupo($nomb,$desc);
        $nuevo->getGrupo($nomb);
        $array = $nuevo->getGrupoArray();
        return $array;
    }

    function pre_modificarGrupo($nomb, $desc) {
        $nuevo = new Grupo($nomb, $desc);
        $nuevo->setNombre($nomb);
        $nuevo->setDescripcion($desc);
        $nuevo->modificarGrupo($nomb, $desc);
    }

    function mostrarTablas() {
        $lista = new Lista();
        $lista->listaTablas();
        $l = $lista->getLista();

        $tam = count($l);

        $str = "";
        $i = 0;
        while($i<$tam) {
            $elem = $l[$i];
            $str = $str."<option value='$elem'>$elem</option>";
            $i++;
        }
        return $str;
    }

    function pre_crearPrivil($nombT, $acc) {

        $pr = new Privilegio();
        $pr->setNombreTabla($nombT);
        $pr->setAccion($acc);
        $pr->insertarPriv();
    }


    function pre_obtenerListaPrivilegios() {
        $nuevo = new ListaPrivilegios();
        return $nuevo->obtenerListaPrivilegios();
    }

    function pre_consultarPrivilegio($id) {
        $nuevo = new Privilegio();
        $nuevo->getPrivilegio($id);
        $array = $nuevo->getPrivilegioArray();
        return $array;
    }

    //Funciones Respuesta/////////////////////////////////////////////////////

    function crearPersonaAfectada($id, $descripcion, $nombre, $ubicado, $ci,
            $contacto, $telefono, $foto,
            $fechaDesaparicion) {

        // Crea un objeto persona afectada.
        $persona = new PersonaAfectada($id, $descripcion, $nombre, $ubicado,
                $ci, $contacto, $telefono,
                $foto, $fechaDesaparicion);

        // Inserta la persona afectada.
        $persona->insertarPersonaAfectada();
    }

    //  Crea el centro de apoyo y lo inserta en la bd
    function crearCentroApoyo($Nombre, $tipo, $desastre, $capacidad, $Ubicacion, $lat, $lng, $fecha){

        // Crea un objeto centro Apoyo.
        $centro = new CentroApoyo($Nombre, $tipo, $desastre, $capacidad, $Ubicacion, $lat, $lng, $fecha);

        // Inserta el centro de Apoyo.
        $centro->insertarCentroApoyo();
    }

     // Obtiene una lista de personas afectadas de la base de datos.
    function consultarPersonaAfectada() {

        $listaPersonas = new Lista_PersonaAfectada(); // Crea una lista.
        $listaPersonas->consultarPersonaAfectada();

        return $listaPersonas;
    }
    function consultarPersonaAfectadaF($_POST) {

        $listaPersonas = new Lista_PersonaAfectada(); // Crea una lista.
        $listaPersonas->consultarPersonaAfectadaF($_POST);

        return $listaPersonas;
    }
    function consultarPersonaAfectadaEx($_POST) {

        $listaPersonas = new Lista_PersonaAfectada(); // Crea una lista.
        $listaPersonas->consultarPersonaAfectadaEx($_POST);

        return $listaPersonas;
    }
     // Obtiene una lista de Centros de Apoyo de la base de datos.
    function consultarCentroApoyo() {

        $listaCentros = new Lista_PersonaAfectada(); // Crea una lista.
        $listaCentros->consultarCentrosApoyo();

        return $listaCentros;
    }

    public function eliminarPersonasAfectadas($personas) {
			$i = 0;
			$exit = "";
			while($i < $personas["hidden1"]) {
				if(isset($personas[$i])) {
					$persona = new PersonaAfectada($personas[$i]);
					if(!$persona->eliminarPersonaAfectada()) {
						$exit = $exit . "No se pudo eliminar la persona con id: {$personas[$i]}\n";
					};
				};
				$i = $i + 1;
			};

			return $exit;
		}


    //Funcion para Insertar una zona en emergencia.
    function crearZonaEmergencia($id,$tipo,$fecha,$coordenadas){

      //Se crea la una instancia de ZonaEmergencia con los datos ingresados
      $zona = new ZonaEmergencia($id,$tipo, $fecha,$coordenadas);

      //Se llama a la funcion insertar en la capa logica
      $zona->Insertar();

    }

    function consultarZonaEmergencia($tipo,$fecha){

        $listaZonas = new Lista_PersonaAfectada(); // Crea una lista.

        $listaZonas->consultarZonaEmergencia($tipo,$fecha);

        return $listaZonas;

      
    }

    //Funcion para Eliminar una zona en emergencia dado su id
    function EliminarZonaEmergencia($id) {

        //Se crea la una instancia de ZonaEmergencia con el id ingresado
        $zona = new ZonaEmergencia($id,NULL,NULL, NULL);
        //Se llama a la funcion eliminar en la capa logica
        $zona->Eliminar();
    }

    function EliminarCentroApoyo($id){
        //Se crea una instancia de centro con el id ingresado
        $centro = new CentroApoyo($id, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
        //Se llama a la funcion eliminar en la capa logica
        $centro->eliminarCentroApoyo();
    }


    //Funciones Recuperacion//////////////////////////////////////////////////

    public function crearDonacionOfrecida($desc, $tip, $cant, $idUsuario, $edo) {

        $don = new donacion(0, $desc, 1, $tip, $cant, $idUsuario, $edo);
        return $don;

    }


    public function OfrecerDonacion(donacion $datos) {

        $fachada = (FachadaBD::getInstance());
        $listaDon = $fachada -> obtenerSolicDon($datos -> obtenerEdo(), $datos -> obtenerTipo());
        $cant = $datos -> obtenerCant();
        $asignada = array();

        foreach ($listaDon as $elem) {

            if ($cant == 0) {
                break;
            }

            $cantS = $elem -> obtenerCant();

            if ($cant == $cantS) {
                $cant = 0;
                $fachada -> eliminarDon($elem -> obtenerID());
                $asignada[] = array('id' => $elem -> obtenerIdUsuario(), 'cant' => $cantS);

            }

            else if ($cant > $cantS) {
                $cant = $cant - $cantS;
                $fachada -> eliminarDon($elem -> obtenerID());
                $asignada[] = array('id' => $elem -> obtenerIdUsuario(), 'cant' => $cantS);
            }

            else if ($cant < $cantS) {
                $cantS = $cantS - $cant;
                $asignada[] = array('id' => $elem -> obtenerIdUsuario(), 'cant' => $cant);
                $cant = 0;
                $fachada -> modificarDon($elem -> obtenerID(), $cantS);
            }
        }

        if ($cant != 0) {
            $datos -> setCantidad($cant);
            $fachada -> insertarDon($datos);

            if (sizeof($listaDon) != 0) {
                $asignada[] = "sobra";
            }
        }

        return $asignada;
    }

    public function crearDonacionSolicitada($desc, $tip, $cant, $idUsuario, $edo) {

        $don = new donacion(0, $desc, 0, $tip, $cant, $idUsuario, $edo);
        return $don;

    }

    public function SolicitarDonacion(donacion $datos) {

        $fachada = (FachadaBD::getInstance());
        $lista = $fachada -> obtenerOfrecDon($datos -> obtenerEdo(), $datos -> obtenerTipo());

        $cant = $datos -> obtenerCant();
        $tipo = $datos -> obtenerTipo();

        foreach ($lista as $don) {

            if ($cant == 0) {
                break;
            }

            $id = $don -> obtenerID();
            $cantS = $don -> obtenerCant();

            if ($cant == $cantS) {
                $this -> enviarEmailDonacion($don -> obtenerIdUsuario(), $datos -> obtenerIdUsuario(), $cant, $tipo);
                $cant = 0;
                $fachada -> eliminarDon($don -> obtenerID());

            }

            else if ($cant > $cantS) {
                $cant = $cant - $cantS;
                $fachada -> eliminarDon($don -> obtenerID());
                $this -> enviarEmailDonacion($don -> obtenerIdUsuario(), $datos -> obtenerIdUsuario(), $cantS, $tipo);
            }

            else if ($cant < $cantS) {
                $cantS = $cantS - $cant;
                $this -> enviarEmailDonacion($don -> obtenerIdUsuario(), $datos -> obtenerIdUsuario(), $cant, $tipo);
                $cant = 0;
                $fachada -> modificarDon($don -> obtenerID(), $cantS);
            }


        }

        if ($cant != 0) {

            $datos -> setCantidad($cant);
            $fachada -> insertarDon($datos);
        }
    }

    public function enviarEmailDonacion($id_usr, $id_centro, $cant,$tipo){

        $datos_usr = $this -> obtenerDatosCentro($id_usr);
        $datos_centro = $this -> obtenerDatosCentro($id_centro);

        if($tipo == 1) $tipo = "Vestimenta";
        else if ($tipo == 2) $tipo = "Alimentos";
        else if ($tipo == 3) $tipo = "Aseo Personal";
        else if ($tipo == 4) $tipo = "Medicamentos";
        else if ($tipo == 5) $tipo = "Monetaria";
        else if ($tipo == 6) $tipo = "Agua";


        $asunto = "¡Su donacion ha sido asignada por SMCE!";
        $contenido =    "Buenos dias, ".($datos_usr[1])."<br><br>".
                        "Su donacion (".$cant.",".$tipo.") ha sido asignada, por favor pongase en contacto con el centro de acopio lo antes posible.<br><br>".
                        "Centro de Acopio: ".($datos_centro[1]).
                        "<br>Correo electronico: ".($datos_centro[2]).
                        "<br>Telefono: ".($datos_centro[3]).
                        "<br><br>¡Muchas gracias por su ayuda!<br>Saludos, SMCE";
        $email = $datos_usr[2];

        MailManager::getInstance()->SendMail2($asunto, $contenido, $email);

    }


    public function obtenerId($nombre){

        $fachada = (FachadaBD::getInstance());
        $id = $fachada -> obtenerUsuario($nombre);
        return $id;        

    }


    public function obtenerDatosCentro($id) {

        $fachada = (FachadaBD::getInstance());
        $datos = $fachada -> obtenerDatosCentro($id);
        return $datos;
    }


    public function crearVoluntarioOfrecido($ubic, $edo, $hab, $idUsuario) {

        $vol = new voluntario(0, $hab, $ubic, 0, $idUsuario, $edo);
        return $vol;

    }

    public function SolicitarVoluntario(voluntario $datos) {

        $fachada = (FachadaBD::getInstance());
        $lista = $fachada -> obtenerOfrecVol($datos -> obtenerEdo(), $datos -> obtenerHabi());


        $habi = $datos -> obtenerHabi();
        $cant = $datos -> obtenerCant();

        foreach ($lista as $volun) {

            if ($cant == 0) {
                break;
            }

            $id = $volun -> obtenerID();
            $this -> enviarEmailVoluntario($volun -> obtenerIdUsuario(), $datos -> obtenerIdUsuario(), $habi);
            $fachada -> eliminarVol($id);
            $cant = $cant-1;
        }

        if ($cant != 0) {

            $datos -> setCantidad($cant);
            $fachada -> insertarVol($datos);
        }
    }

    public function enviarEmailVoluntario($id_usr, $id_centro, $tipo){

        $datos_usr = $this -> obtenerDatosCentro($id_usr);
        $datos_centro = $this -> obtenerDatosCentro($id_centro);

        if($tipo == 1) $tipo = "Construccion";
        else if ($tipo == 2) $tipo = "Bombero";
        else if ($tipo == 3) $tipo = "Medico";
        else if ($tipo == 4) $tipo = "Generales";


        $asunto = "¡SMCE te ha asignado como voluntario!";
        $contenido =    "Buenos dias, ".($datos_usr[1])."<br><br>".
                        "Fuiste asignado como voluntario (".$tipo."). Por favor pongase en contacto con el centro de recuperacion lo antes posible.<br><br>".
                        "Centro de Recuperacion: ".($datos_centro[1]).
                        "<br>Correo electronico: ".($datos_centro[2]).
                        "<br>Telefono: ".($datos_centro[3]).
                        "<br><br>¡Muchas gracias por su ayuda!<br>Saludos, SMCE";
        $email = $datos_usr[2];

        MailManager::getInstance()->SendMail2($asunto, $contenido, $email);

    }

    public function crearVoluntarioSolicitado($ubic, $edo, $hab, $idUsuario, $cant) {

        $vol = new voluntario(0, $hab, $ubic, $cant, $idUsuario, $edo);
        return $vol;

    }

    public function OfrecerVoluntario(voluntario $datos) {

        $fachada = (FachadaBD::getInstance());
        $elem = $fachada -> obtenerSolicVol($datos -> obtenerEdo(), $datos -> obtenerHabi());
        $asignada = "no";

        if ($elem) {
            $asignada = $elem -> obtenerIdUsuario();
            $cantS = $elem -> obtenerCant();

            $cantS = $cantS - 1;

            if ($cantS == 0) {
                $fachada -> eliminarVol($elem -> obtenerID());
            }
            else {
                $fachada -> modificarVol($elem -> obtenerID(), $cantS);
            }
        }
        else {
            $fachada -> insertarVol($datos);
        }
        return $asignada;
    }

        public function obtenerAtributo($nombre) {

        $fachada = (FachadaBD::getInstance());
        $atr = $fachada -> obtenerAtributo($nombre);
        return $atr;

    }

    // <editor-fold defaultstate="collapsed" desc="Recuperacion_Reporte">
    public function ReportarDanos(ReporteDano $datos) {
        $ente = FachadaBD::getInstance()->getEnteGub($datos->getUbicacion());

        $user = new Usuario();
        $user->getUsuario($datos->getUsuario());

        $reporte = new Reporte($datos, $user, $ente);

        $reporte->analizarDescripcion();

        $contenido=
                "<p>El usuario \"".$user->nombre." ".$user->apellido."\" ha hecho un reporte de da&ntilde;os "
                ."a nuestra pagina web.<br>Los datos de contacto de este usuario son:<br>"
                ."<b>Telefono:</b>".$user->telefono."<br>"
                ."<b>Correo:</b> ".$user->email."<br>"
                ."<b>El reporte de este usuario es el siguiente:</b> ".$reporte->getDescripcion()."</p>";

        $asunto = "Email de reporte de datos de SISMACEM";

        MailManager::getInstance()->SendMail($asunto, $contenido, $ente->getCorreo());

        $reporte->save();
    }

    public function getArrayEstados() {
        return FachadaBD::getInstance()->getArrayEstados();
    }
    // </editor-fold>

}
?>
